#ifndef __CBB_QUEUE_H__
#define __CBB_QUEUE_H__

#include <stdint.h>

/*
 * @note 依赖项：
    "cbb_mem.h"     内存管理 -- 可选
*/

// 替换为自己的内存管理头文件 -- 不使用内存管理时可注释掉
#include "cbb_mem.h"
#define QUEUE_MALLOC(size) S_MALLOC(size)

// 不适用内存管理 -- 全局创建队列类
#ifndef QUEUE_MALLOC
#define QUEUE_MALLOC(size) NULL
#endif

// 队列返回值
typedef enum QUEUE_RET{
    QUEUE_RET_OK = 0,
    QUEUE_RET_FULL,
    QUEUE_RET_EMPTY,
    QUEUE_RET_ERR,
    QUEUE_RET_BUSY,
}QUEUE_RET_t;

// 队列对象
typedef struct Queue{

    uint8_t* pu8Cache;      // 队列缓存区
    uint16_t u16Cnt;        // 队列中元素个数
    uint16_t u16ObjSize;    // 队列中元素的大小
    uint16_t u16MaxCnt;     // 队列最大元素个数
    uint16_t u16Head;       // 队列头指针
    uint16_t u16Tail;       // 队列尾指针
    uint16_t u16Flag;       // 队列标志位
}Queue_t;

/**
 * @brief 创建队列
 * @param u16ObjSize 队列中元素的大小
 * @param u16MaxCnt 队列最大元素个数
 * @return 队列对象指针
 */
Queue_t*
cbb_queue_register(uint16_t u16ObjSize, uint16_t u16MaxCnt);

/**
 * @brief 向队列中添加元素
 * @param pObj 待添加的元素指针
 * @return @see QUEUE_RET_t
 */
QUEUE_RET_t
cbb_queue_psuh(Queue_t* pstQueue, void* pvObj);

/**
 * @brief 从队列中取出元素
 * @param pObj 取出的元素指针
 * @return @see QUEUE_RET_t
 */
QUEUE_RET_t
cbb_queue_pull(Queue_t* pstQueue, void* pvObj);

#endif /* __QUEUE_H__ */
